/**
 * 
 */
package comunicaciones;

/**
 * @author hvc
 *
 */

//import java.util.concurrent.*;
import java.net.*;
import java.io.*;

public class BuzonEscritura extends Thread {
	
	private Buzon buzon;
	private Socket socket;
	private ObjectOutputStream flujo;
	private boolean control;

	public BuzonEscritura(Socket socket, Buzon buzon) {
		this.buzon = buzon;
		this.socket = socket;
		this.control = true;
		try{
			this.flujo = new ObjectOutputStream(socket.getOutputStream());
		}catch(IOException e1){
			System.out.println("BuzonEscrituta-: Ha ocurrido un error de E/S");
			e1.printStackTrace();
			// cliente.close();
			System.exit(1);
		}catch(SecurityException e2){
			System.out.println("BuzonEscrituta-: Subclases no confiables ilegalmente sobrescribe metodos de seguridad sensibles.");
			//socketS.close();
        	e2.printStackTrace();
			System.exit(1);
		}catch(NullPointerException e3){
			System.out.println("BuzonEscrituta-: El argumento pasado del metodo es nulo.");
			//socketS.close();
        	e3.printStackTrace();
			System.exit(1);
		}
	}

	/* (non-Javadoc)
	 * @see java.lang.Thread#run()
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//super.run();
		while(control){
			if(buzon.hayMensajesEscritura()){
				Mensaje mensaje = buzon.obtenerMensajeEscrituta();
				try{
					flujo.writeObject(mensaje);
				}catch(IOException e){
					System.out.println("BuzonEscrituta-: Una excepcion lanzada por un flujo de salida subyacente, o");
					System.out.println("BuzonEscrituta-: algo esta incorrecto con una clase usada por la seralizacion , o.");
					System.out.println("BuzonEscrituta-: algun objecto para ser serializado no implementa la interfaz java.io.Serializable.");
					//socketS.close();
		        	e.printStackTrace();
					System.exit(1);
				}
			}
		}
		try{
			this.flujo.flush();
		}catch(IOException e){
			System.out.println("BuzonEscrituta-: Un error de E/S ha ocurrido.");
			//socketS.close();
        	e.printStackTrace();
			System.exit(1);
		}
		try{
			this.flujo.close();
		}catch(IOException e){
			System.out.println("BuzonEscrituta-: Un error de E/S ha ocurrido.");
			//socketS.close();
        	e.printStackTrace();
			System.exit(1);
		}
		try{
			this.socket.close();
		}catch(IOException e){
			System.out.println("BuzonEscrituta-: Un error de E/S ha ocurrido.");
			//socketS.close();
        	e.printStackTrace();
			System.exit(1);
		}
		System.out.println("Saliendo Buzon de Escritura");
	}
	
	/**
	 * @return the buzon
	 */
	public Buzon getBuzon() {
		return buzon;
	}

	/**
	 * @param buzon the buzon to set
	 */
	public void setBuzon(Buzon buzon) {
		this.buzon = buzon;
	}

	/**
	 * @return the socket
	 */
	public Socket getSocket() {
		return socket;
	}

	/**
	 * @param socket the socket to set
	 */
	public void setSocket(Socket socket) {
		this.socket = socket;
	}

	/**
	 * @return the flujo
	 */
	public ObjectOutputStream getFlujo() {
		return flujo;
	}

	/**
	 * @param flujo the flujo to set
	 */
	public void setFlujo(ObjectOutputStream flujo) {
		this.flujo = flujo;
	}

	/**
	 * @return the control
	 */
	public boolean isControl() {
		return control;
	}

	/**
	 * @param control the control to set
	 */
	public void setControl(boolean control) {
		this.control = control;
	}
	
	public void cerrar(){
		System.out.println("Cerrando BuzonEscritura");
		this.control = false;
	}

}
